"MAY LISTING 2"  AS SAVED ON DISK
0800              1           TTL "SPEED/ASM Demo"
0800              2  ;
0800              3  ;************************************
0800              4  ;*                                  *
0800              5  ;* Listing Two: SPEED/ASM Demo      *
0800              6  ;*              program             *
0800              7  ;*                                  *
0800              8  ;************************************
0800              9  ;
0800             10  ;
0800             11  ;
0000             12  FALSE    EQU 0
0001             13  TRUE     EQU 1
008D             14  CR       EQU $8D
0800             15  ;
0800             16  ;
0800             17  ;
0800             18  ;
0800             19  ;
0800             20  ; SPEED/ASM ENTRY POINTS
0800             21  ; (Only the equates necessary for
0800             22  ;  this demo are included.)
0800             23  ;
0800             24  ;
0800             25  ;
0800             26  ; NOTE: THE EQUATE OF PUTC MUST
0800             27  ; BE CHANGED IF YOU RELOCATE
0800             28  ; SPEED/ASM TO SOME LOCATION
0800             29  ; OTHER THAN $7800
0800             30  ;
7800             31  PUTC     EQU $7800
7803             32  GETC     EQU PUTC+3
7806             33  SAGL     EQU GETC+3          ;FOR USE BY S/A ONLY- SEE DOC.
7809             34  SAPC     EQU SAGL+3          ; "   "   "  "   "     "   "
780C             35  HOME     EQU SAPC+3          ;HOME AND CLEAR
780F             36  READLN   EQU HOME+3
7812             37  INIT     EQU READLN+3
7815             38  FOR      EQU INIT+3
7818             39  FOR0     EQU FOR+3
781B             40  NEXT     EQU FOR0+3
781E             41  IFI      EQU NEXT+3
7821             42  IFI0     EQU IFI+3
7824             43  IFS      EQU IFI0+3
7827             44  IFS0     EQU IFS+3
782A             45  MOVE     EQU IFS0+3
782D             46  LOAD     EQU MOVE+3
7830             47  MOVS     EQU LOAD+3
7833             48  LDSTR    EQU MOVS+3
7836             49  PRINT    EQU LDSTR+3
7839             50  PRTSTR   EQU PRINT+3
783C             51  PRTINT   EQU PRTSTR+3
783F             52  RDSTR    EQU PRTINT+3
7842             53  RDINT    EQU RDSTR+3
7845             54  ONXGOTO  EQU RDINT+3
7848             55  CASE     EQU ONXGOTO+3
784B             56  CASEI    EQU CASE+3
784E             57  INSET    EQU CASEI+3
7851             58  NOTINSET EQU INSET+3
7854             59  ABS      EQU NOTINSET+3
7857             60  NEG      EQU ABS+3
785A             61  MUL      EQU NEG+3
785D             62  DIV      EQU MUL+3
7860             63  MOD      EQU DIV+3
7863             64  RND      EQU MOD+3
0800             65  ;
0800             66  ;
0800             67  ;
0800             68  ; Apple monitor equates;
0800             69  ;
FF69             70  EXIT     EQU $FF69           ; Address to quit S/A.
0800             71  ;
0800             72  ;
0800             73  ;
0800             74  ; ****************************
0800             75  ;
0800             76  ;
0800             77  ; NOTE: INIT must be called before
0800             78  ; any other SPEED/ASM routine.
0800             79  ;
0800 20 12 78    80  START    JSR INIT
0803             81  ;
0803             82  ;
0803             83  ; The following code loads 10 into
0803             84  ; "I" and 54 into "J" the computes
0803             85  ; there sum, difference, product,
0803             86  ; quotient, and remainder.
0803             87  ;
0803 20 2D 78    88           JSR LOAD
0806 0A 00 12    89           ADR 10,I
0809 0B 
080A 20 2D 78    90           JSR LOAD
080D 36 00 14    91           ADR 54,J
0810 0B 
0811             92  ;
0811             93  ; Compute the sum:
0811             94  ;
0811 18          95  LOOP     CLC                 ; Always CLC before addition.
0812 AD 12 0B    96           LDA I
0815 6D 14 0B    97           ADC J
0818 8D 16 0B    98           STA SUM
081B AD 13 0B    99           LDA I+1
081E 6D 15 0B   100           ADC J+1
0821 8D 17 0B   101           STA SUM+1
0824 70 69      102           BVS OVERFLOW        ; Check for >32767.
0826            103  ;
0826            104  ; Calculate the difference:
0826            105  ;
0826 38         106           SEC                 ; Always SEC before subtraction.
0827 AD 12 0B   107           LDA I
082A ED 14 0B   108           SBC J
082D 8D 1C 0B   109           STA DIFFRNCE
0830 AD 13 0B   110           LDA I+1
0833 ED 15 0B   111           SBC J+1
0836 8D 1D 0B   112           STA DIFFRNCE+1
0839 70 54      113           BVS OVERFLOW
083B            114  ;
083B            115  ; Calculate the product:
083B            116  ;
083B 20 5A 78   117           JSR MUL
083E 12 0B 14   118           ADR I,J,PRODUCT
0841 0B 18 0B 
0844 70 49      119           BVS OVERFLOW
0846            120  ;
0846            121  ; Calculate the quotient
0846            122  ;
0846 20 5D 78   123           JSR DIV
0849 14 0B 12   124           ADR J,I,QUOTIENT    ; J/I, not I/J
084C 0B 1A 0B 
084F 70 3E      125           BVS OVERFLOW
0851            126  ;
0851            127  ; Calculate the remainder
0851            128  ;
0851 20 60 78   129           JSR MOD
0854 14 0B 12   130           ADR J,I,REMANDR
0857 0B 1E 0B 
085A 70 33      131           BVS OVERFLOW
085C            132  ;
085C            133  ;
085C            134  ; Generate a couple of random numbers
085C            135  ;
085C 20 63 78   136           JSR RND
085F 20 0B      137           ADR RANDOM1
0861 20 54 78   138           JSR ABS
0864 20 0B      139           ADR RANDOM1
0866 70 27      140           BVS OVERFLOW
0868            141  ;
0868 20 63 78   142           JSR RND
086B 22 0B      143           ADR RANDOM2
086D 20 54 78   144           JSR ABS
0870 22 0B      145           ADR RANDOM2
0872 70 1B      146           BVS OVERFLOW
0874 20 57 78   147           JSR NEG
0877 22 0B      148           ADR RANDOM2
0879 70 14      149           BVS OVERFLOW
087B            150  ;
087B 20 63 78   151           JSR RND
087E 24 0B      152           ADR RANDOM3
0880 20 57 78   153           JSR NEG
0883 24 0B      154           ADR RANDOM3
0885 70 08      155           BVS OVERFLOW
0887            156  ;
0887 20 63 78   157           JSR RND
088A 26 0B      158           ADR RANDOM4
088C 4C A9 08   159           JMP PRTNUMS
088F            160  ;
088F 20 36 78   161  OVERFLOW JSR PRINT
0892 8D 8D CF   162           BYT CR,CR,"Overflow occured",CR,0
0895 F6 E5 F2 
0898 E6 EC EF 
089B F7 A0 EF 
089E E3 E3 F5 
08A1 F2 E5 E4 
08A4 8D 00 
08A6 4C 69 FF   163           JMP EXIT
08A9            164  ;
08A9            165  ;
08A9            166  ;
08A9            167  ; Print the sum:
08A9            168  ;
08A9 20 36 78   169  PRTNUMS  JSR PRINT
08AC C9 BD A0   170           BYT "I= ",0
08AF 00 
08B0 20 3C 78   171           JSR PRTINT
08B3 12 0B      172           ADR I
08B5 20 36 78   173           JSR PRINT
08B8 8D CA BD   174           BYT CR,"J= ",0
08BB A0 00 
08BD 20 3C 78   175           JSR PRTINT
08C0 14 0B      176           ADR J
08C2            177  ;
08C2 20 36 78   178           JSR PRINT
08C5 8D D4 E8   179           BYT CR,"The sum is ",0
08C8 E5 A0 F3 
08CB F5 ED A0 
08CE E9 F3 A0 
08D1 00 
08D2 20 3C 78   180           JSR PRTINT
08D5 16 0B      181           ADR SUM
08D7            182  ;
08D7            183  ; Print the difference:
08D7            184  ;
08D7 20 36 78   185           JSR PRINT
08DA 8D D4 E8   186           BYT CR,"The difference (I-J) is ",0
08DD E5 A0 E4 
08E0 E9 E6 E6 
08E3 E5 F2 E5 
08E6 EE E3 E5 
08E9 A0 A8 C9 
08EC AD CA A9 
08EF A0 E9 F3 
08F2 A0 00 
08F4 20 3C 78   187           JSR PRTINT
08F7 1C 0B      188           ADR DIFFRNCE
08F9            189  ;
08F9            190  ; Print the product:
08F9            191  ;
08F9 20 36 78   192           JSR PRINT
08FC 8D D4 E8   193           BYT CR,"The product is ",0
08FF E5 A0 F0 
0902 F2 EF E4 
0905 F5 E3 F4 
0908 A0 E9 F3 
090B A0 00 
090D 20 3C 78   194           JSR PRTINT
0910 18 0B      195           ADR PRODUCT
0912            196  ;
0912            197  ; Print the quotient
0912            198  ;
0912 20 36 78   199           JSR PRINT
0915 8D D4 E8   200           BYT CR,"The quotient (J/I) is ",0
0918 E5 A0 F1 
091B F5 EF F4 
091E E9 E5 EE 
0921 F4 A0 A8 
0924 CA AF C9 
0927 A9 A0 E9 
092A F3 A0 00 
092D 20 3C 78   201           JSR PRTINT
0930 1A 0B      202           ADR QUOTIENT
0932            203  ;
0932            204  ; Print the reminder:
0932            205  ;
0932 20 36 78   206           JSR PRINT
0935 8D D4 E8   207           BYT CR,"The remainder (J mod I) is ",0
0938 E5 A0 F2 
093B E5 ED E1 
093E E9 EE E4 
0941 E5 F2 A0 
0944 A8 CA A0 
0947 ED EF E4 
094A A0 C9 A9 
094D A0 E9 F3 
0950 A0 00 
0952 20 3C 78   208           JSR PRTINT
0955 1E 0B      209           ADR REMANDR
0957            210  ;
0957            211  ; Print the random numbers:
0957            212  ;
0957 20 36 78   213           JSR PRINT
095A 8D D4 E8   214           BYT CR,"The random numbers are:"
095D E5 A0 F2 
0960 E1 EE E4 
0963 EF ED A0 
0966 EE F5 ED 
0969 E2 E5 F2 
096C F3 A0 E1 
096F F2 E5 BA 
0972 8D D2 E1   215           BYT CR,"Random1: ",0
0975 EE E4 EF 
0978 ED B1 BA 
097B A0 00 
097D 20 3C 78   216           JSR PRTINT
0980 20 0B      217           ADR RANDOM1
0982 20 36 78   218           JSR PRINT
0985 8D D2 E1   219           BYT CR,"Random2: ",0
0988 EE E4 EF 
098B ED B2 BA 
098E A0 00 
0990 20 3C 78   220           JSR PRTINT
0993 22 0B      221           ADR RANDOM2
0995 20 36 78   222           JSR PRINT
0998 8D D2 E1   223           BYT CR,"Random3: ",0
099B EE E4 EF 
099E ED B3 BA 
09A1 A0 00 
09A3 20 3C 78   224           JSR PRTINT
09A6 24 0B      225           ADR RANDOM3
09A8 20 36 78   226           JSR PRINT
09AB 8D D2 E1   227           BYT CR,"Random4: ",0
09AE EE E4 EF 
09B1 ED B4 BA 
09B4 A0 00 
09B6 20 3C 78   228           JSR PRTINT
09B9 26 0B      229           ADR RANDOM4
09BB            230  ;
09BB            231  ;
09BB            232  ; Demonstrate the MOVE subroutine
09BB            233  ;
09BB 20 36 78   234           JSR PRINT
09BE 8D 8D C3   235           BYT CR,CR,"Current contents of I is ",0
09C1 F5 F2 F2 
09C4 E5 EE F4 
09C7 A0 E3 EF 
09CA EE F4 E5 
09CD EE F4 F3 
09D0 A0 EF E6 
09D3 A0 C9 A0 
09D6 E9 F3 A0 
09D9 00 
09DA 20 3C 78   236           JSR PRTINT
09DD 12 0B      237           ADR I
09DF 20 36 78   238           JSR PRINT
09E2 8D C3 F5   239           BYT CR,"Current contents of J is ",0
09E5 F2 F2 E5 
09E8 EE F4 A0 
09EB E3 EF EE 
09EE F4 E5 EE 
09F1 F4 F3 A0 
09F4 EF E6 A0 
09F7 CA A0 E9 
09FA F3 A0 00 
09FD 20 3C 78   240           JSR PRTINT
0A00 14 0B      241           ADR J
0A02            242  ;
0A02 20 2A 78   243           JSR MOVE
0A05 12 0B 14   244           ADR I,J
0A08 0B 
0A09            245  ;
0A09 20 36 78   246           JSR PRINT
0A0C 8D CE EF   247           BYT CR,"Now I contains ",0
0A0F F7 A0 C9 
0A12 A0 E3 EF 
0A15 EE F4 E1 
0A18 E9 EE F3 
0A1B A0 00 
0A1D 20 3C 78   248           JSR PRTINT
0A20 12 0B      249           ADR I
0A22 20 36 78   250           JSR PRINT
0A25 8D E1 EE   251           BYT CR,"and J contains ",0
0A28 E4 A0 CA 
0A2B A0 E3 EF 
0A2E EE F4 E1 
0A31 E9 EE F3 
0A34 A0 00 
0A36 20 3C 78   252           JSR PRTINT
0A39 14 0B      253           ADR J
0A3B            254  ;
0A3B            255  ;
0A3B            256  ; Ask the user if he wants to re-run
0A3B            257  ; the program with user input.
0A3B            258  ;
0A3B            259  ;
0A3B 20 36 78   260  RERUN    JSR PRINT
0A3E 8D 8D C4   261           BYT CR,CR,"Do you wish to re-run this",CR
0A41 EF A0 F9 
0A44 EF F5 A0 
0A47 F7 E9 F3 
0A4A E8 A0 F4 
0A4D EF A0 F2 
0A50 E5 AD F2 
0A53 F5 EE A0 
0A56 F4 E8 E9 
0A59 F3 8D 
0A5B F0 F2 EF   262           BYT "program (Y/N)? ",0
0A5E E7 F2 E1 
0A61 ED A0 A8 
0A64 D9 AF CE 
0A67 A9 BF A0 
0A6A 00 
0A6B 20 03 78   263           JSR GETC
0A6E 29 DF      264           AND #$DF            ;Convert Lower case to Upper case
0A70 20 00 78   265           JSR PUTC
0A73 C9 CE      266           CMP #"N"
0A75 D0 03      267           BNE >1
0A77 4C 69 FF   268           JMP EXIT
0A7A            269  ;
0A7A C9 D9      270  ^1       CMP #"Y"
0A7C D0 BD      271           BNE RERUN
0A7E            272  ;
0A7E            273  ;
0A7E            274  ; If so, get new values for I and J
0A7E            275  ;
0A7E            276  ;
0A7E 20 36 78   277  BADNUM1  JSR PRINT
0A81 8D         278           BYT CR
0A82 C5 EE F4   279           BYT "Enter a new value for I:",0
0A85 E5 F2 A0 
0A88 E1 A0 EE 
0A8B E5 F7 A0 
0A8E F6 E1 EC 
0A91 F5 E5 A0 
0A94 E6 EF F2 
0A97 A0 C9 BA 
0A9A 00 
0A9B 20 0F 78   280           JSR READLN
0A9E 20 42 78   281           JSR RDINT
0AA1 12 0B      282           ADR I
0AA3 50 21      283           BVC GOODNUM1
0AA5 20 36 78   284           JSR PRINT
0AA8 8D C5 F2   285           BYT CR,"Error in entry, re-enter",CR,0
0AAB F2 EF F2 
0AAE A0 E9 EE 
0AB1 A0 E5 EE 
0AB4 F4 F2 F9 
0AB7 AC A0 F2 
0ABA E5 AD E5 
0ABD EE F4 E5 
0AC0 F2 8D 00 
0AC3 4C 7E 0A   286           JMP BADNUM1
0AC6            287  ;
0AC6 20 36 78   288  GOODNUM1 JSR PRINT
0AC9 8D C5 EE   289           BYT CR,"Enter a new value for J:",0
0ACC F4 E5 F2 
0ACF A0 E1 A0 
0AD2 EE E5 F7 
0AD5 A0 F6 E1 
0AD8 EC F5 E5 
0ADB A0 E6 EF 
0ADE F2 A0 CA 
0AE1 BA 00 
0AE3 20 0F 78   290           JSR READLN
0AE6 20 42 78   291           JSR RDINT
0AE9 14 0B      292           ADR J
0AEB 50 22      293           BVC >0
0AED 20 36 78   294           JSR PRINT
0AF0 8D C2 E1   295           BYT CR,"Bad value for J, re-enter",CR,0
0AF3 E4 A0 F6 
0AF6 E1 EC F5 
0AF9 E5 A0 E6 
0AFC EF F2 A0 
0AFF CA AC A0 
0B02 F2 E5 AD 
0B05 E5 EE F4 
0B08 E5 F2 8D 
0B0B 00 
0B0C 4C C6 0A   296           JMP GOODNUM1
0B0F            297  ;
0B0F 4C 11 08   298  ^0       JMP LOOP
0B12            299  ;
0B12            300  ;
0B12            301  ;
0B12            302  ;
0B12            303  ;
0B12            304  ;
0B12            305  ;
0B12            306  ;
0B12            307  ;***********************************
0B12            308  ;
0B12            309  ; Variable declarations:
0B12            310  ;
0B12            311  ; The following variables are all
0B12            312  ; integers. So they are declared
0B12            313  ; with the ADR pseudo opcode to
0B12            314  ; reserve two bytes for each integer.
0B12            315  ;
0B12            316  ;
0B12 00 00      317  I        ADR 0
0B14 00 00      318  J        ADR 0
0B16            319  ;
0B16 00 00      320  SUM      ADR 0
0B18 00 00      321  PRODUCT  ADR 0
0B1A 00 00      322  QUOTIENT ADR 0
0B1C 00 00      323  DIFFRNCE ADR 0
0B1E 00 00      324  REMANDR  ADR 0
0B20 00 00      325  RANDOM1  ADR 0
0B22 00 00      326  RANDOM2  ADR 0
0B24 00 00      327  RANDOM3  ADR 0
0B26 00 00      328  RANDOM4  ADR 0
0B28            329  ;
0B28            330           END 
